@@ -0,0 +1,41 @@ |
||
| 1 |
+class SwitchToJsonSerialization < ActiveRecord::Migration |
|
| 2 |
+ FIELDS = {
|
|
| 3 |
+ :agents => [:options, :memory], |
|
| 4 |
+ :events => [:payload] |
|
| 5 |
+ } |
|
| 6 |
+ |
|
| 7 |
+ def up |
|
| 8 |
+ puts "This migration will update Agent and Event storage from YAML to JSON. It should work, but please make a backup" |
|
| 9 |
+ puts "before proceeding." |
|
| 10 |
+ print "Continue? (y/n) " |
|
| 11 |
+ STDOUT.flush |
|
| 12 |
+ exit unless STDIN.gets =~ /^y/i |
|
| 13 |
+ |
|
| 14 |
+ translate YAML, JSON |
|
| 15 |
+ end |
|
| 16 |
+ |
|
| 17 |
+ def down |
|
| 18 |
+ translate JSON, YAML |
|
| 19 |
+ end |
|
| 20 |
+ |
|
| 21 |
+ def translate(from, to) |
|
| 22 |
+ FIELDS.each do |table, fields| |
|
| 23 |
+ quoted_table_name = ActiveRecord::Base.connection.quote_table_name(table) |
|
| 24 |
+ fields = fields.map { |f| ActiveRecord::Base.connection.quote_column_name(f) }
|
|
| 25 |
+ |
|
| 26 |
+ rows = ActiveRecord::Base.connection.select_rows("SELECT id, #{fields.join(", ")} FROM #{quoted_table_name}")
|
|
| 27 |
+ rows.each do |row| |
|
| 28 |
+ id, *field_data = row |
|
| 29 |
+ |
|
| 30 |
+ yaml_fields = field_data.map { |f| from.load(f) }.map { |f| to.dump(f) }
|
|
| 31 |
+ |
|
| 32 |
+ update_sql = "UPDATE #{quoted_table_name} SET #{fields.map {|f| "#{f}=?"}.join(", ")} WHERE id = ?"
|
|
| 33 |
+ |
|
| 34 |
+ sanitized_update_sql = ActiveRecord::Base.send :sanitize_sql_array, [update_sql, *yaml_fields, id] |
|
| 35 |
+ |
|
| 36 |
+ ActiveRecord::Base.connection.execute sanitized_update_sql |
|
| 37 |
+ end |
|
| 38 |
+ end |
|
| 39 |
+ |
|
| 40 |
+ end |
|
| 41 |
+end |
@@ -8,7 +8,7 @@ module SerializeAndNormalize |
||
| 8 | 8 |
normalize_name = "normalize_#{column_name}".to_sym
|
| 9 | 9 |
validate_name = "validate_#{column_name}".to_sym
|
| 10 | 10 |
|
| 11 |
- serialize column_name |
|
| 11 |
+ serialize column_name, JSON |
|
| 12 | 12 |
after_initialize setup_name |
| 13 | 13 |
before_validation normalize_name |
| 14 | 14 |
before_save normalize_name |